package com.yuncheng.spcyApi.utils;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 计算Cron表达式-工具类
 */
public class CronUtils {

    // 获取每多少分钟执行的Cron表达式 0 0/30 * * * ?
    public static String getCronWithStr(String minute){
        StringBuffer cron = new StringBuffer();
        cron.append("0").append(" ").append("0").append("/").append(minute).append(" ");
        cron.append("*").append(" ").append("*").append(" ").append("*").append(" ").append("?");

        return cron.toString();
    }

    // 获取每多少分钟执行的Cron表达式 0 30/30 * * * ?
    public static String getCronBetweenWithStrByMiu(String minute){
        StringBuffer cron = new StringBuffer();
        cron.append("0").append(" ").append(minute).append("/").append(minute).append(" ");
        cron.append("*").append(" ").append("*").append(" ").append("*").append(" ").append("?");

        return cron.toString();
    }

    // 获取每多少分钟执行的Cron表达式 0 30/30 * * * ?
    public static String getCronBetweenWithStrByMiu(int ksMiu, int midMiu){
        StringBuffer cron = new StringBuffer();
        cron.append("0").append(" ").append(ksMiu).append("/").append(midMiu).append(" ");
        cron.append("*").append(" ").append("*").append(" ").append("*").append(" ").append("?");

        return cron.toString();
    }

    // 获取每多少小时执行的Cron表达式 0 0 0/1 * * ? 每天一个小时执行一次
    public static String getCronBetweenWithStrByHour(int ksHour, int midHour){
        StringBuffer cron = new StringBuffer();
        cron.append("0").append(" ");
        cron.append("0").append(" ");
        cron.append(ksHour).append("/").append(midHour).append(" ");
        cron.append("*").append(" ");
        cron.append("*").append(" ").append("?");

        return cron.toString();
    }

    // 获取每天几点执行的Cron表达式 0 0 2 * * ? 每天凌晨2点
    public static String getCronEveryDayHourWithStrByHour(int hour){
        StringBuffer cron = new StringBuffer();
        cron.append("0").append(" ");
        cron.append("0").append(" ");
        cron.append(hour).append(" ");
        cron.append("*").append(" ");
        cron.append("*").append(" ").append("?");

        return cron.toString();
    }

    // 定时任务-获取每几天执行一次Cron表达式：每几天执行一次（3点） 0 0 3 */3 * ?
    public static String getCronEveryFewDaysStr(String days){
        StringBuffer cron = new StringBuffer();
        cron.append("0").append(" ").append("0").append(" ").append("3").append(" ");
        cron.append("*").append("/").append(days).append(" ").append("*").append(" ").append("?");

        return cron.toString();
    }

    public static String getCronEveryFewDaysStr(String days,String hours){
        StringBuffer cron = new StringBuffer();
        cron.append("0").append(" ").append("0").append(" ").append(hours).append(" ");
        cron.append("*").append("/").append(days).append(" ").append("*").append(" ").append("?");

        return cron.toString();
    }

    public static String getCronEveryFewDaysStr(String days,String hours,String minute){
        StringBuffer cron = new StringBuffer();
        cron.append("0").append(" ").append(minute).append(" ").append(hours).append(" ");
        cron.append("*").append("/").append(days).append(" ").append("*").append(" ").append("?");

        return cron.toString();
    }

    /**
     * 每年时间format格式
     */
    private static final String DATEFORMAT_YEAR = "ss mm HH dd MM ?";
    public static final String DATEFORMAT_YEAR_FORMAT = "DATEFORMAT_YEAR";
    public static final String DATEFORMAT_EVERYDAY_FORMAT = "DATEFORMAT_EVERYDAY";
    public static final String SUNDAY_FORMAT = "SUNDAY";

    /**
     * 每天时间format格式
     */
    private static final String DATEFORMAT_EVERYDAY = "ss mm HH * * ?";

    /**
     * 每周时间format格式
     */
    private static final String SUNDAY = "ss mm HH ? * 1";
    private static final String MONDAY = "ss mm HH ? * 2";
    private static final String TUESDAY = "ss mm HH ? * 3";
    private static final String WEDNESDAY = "ss mm HH ? * 4";
    private static final String THURSDAY = "ss mm HH ? * 5";
    private static final String FRIDAY = "ss mm HH ? * 6";
    private static final String SATURADY = "ss mm HH ? * 7";

    public static String formatDateByPattern(Date date, String dateFormat) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        String formatTimeStr = null;
        if (date != null) {
            formatTimeStr = sdf.format(date);
        }
        return formatTimeStr;
    }
    /**
     * 时间转换时间表达式
     * @param type DATEFORMAT_YEAR:每年时间format格式 | DATEFORMAT_EVERYDAY: 每天时间format格式 | SUNDAY: 每周时间format格式
     */
    public static String getCron(Date date, String type) {
        String dateFormat = "";
        if (type.equals(DATEFORMAT_YEAR_FORMAT)){
            dateFormat = DATEFORMAT_YEAR;

        }else if (type.equals(DATEFORMAT_EVERYDAY_FORMAT)){
            dateFormat = DATEFORMAT_EVERYDAY;

        }else if (type.equals(SUNDAY_FORMAT)){
            dateFormat = SUNDAY;

        }
        return formatDateByPattern(date, dateFormat);
    }

    public static void main(String[] args)throws Exception{
        String cron = getCron(new Date(), SUNDAY_FORMAT);
        System.out.println("每周六执行"+cron);

        String cron1 = getCron(new Date(), DATEFORMAT_EVERYDAY_FORMAT);
        System.out.println("每天执行"+cron1);

        String cron2 = getCron(new Date(), DATEFORMAT_YEAR_FORMAT);
        System.out.println("执行一次"+cron2);

    }

}
